/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package colloque.forms;


import colloque.Colloque;
import colloque.HibernateUtil;
import colloque.MotCle;
import colloque.Utilisateur;
import colloque.servlets.CreerColloque;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author James
 */
public class ColloqueForm {

    private Map<String, String> erreurs      = new HashMap<String, String>();

    /**
     *
     * @return
     */
    public Map<String, String> getErreurs() {
        return erreurs;
    }

    Session session = null;

    /**
     *
     */
    public ColloqueForm() {
        this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    /**
     * Créée un nouveau colloque
     * 
     * @param request
     */
    public void createColloque(HttpServletRequest request) {
        /* Récupération des champs du formulaire */
        Utilisateur utilisateur_session = (Utilisateur) request.getSession().getAttribute("sessionUtilisateur");
        try {
            Transaction tr = session.beginTransaction();
            String nomCol = request.getParameter("nomc");
            String DateDepot = request.getParameter("ddepot");
            String description = request.getParameter("description");
            String[] mc = request.getParameterValues("mc1");
            Colloque colloque = new Colloque();
            // La liste des mot cles choisis
            List<String> lmc = Arrays.asList(mc);
            Date date = new Date();
            Set<MotCle> motcles = new HashSet<MotCle>();
            for (int i=0;i<lmc.size();i++){
                motcles.add((MotCle) session.get(MotCle.class, Integer.parseInt(lmc.get(i))));
            }
            try {
                date = colloque.stringToDate(DateDepot);
            } catch (ParseException ex) {
                Logger.getLogger(CreerColloque.class.getName()).log(Level.SEVERE, null, ex);
            }
            colloque.setColloquenom(nomCol);
            colloque.setColloquedescription(description);
            colloque.setPresident(utilisateur_session);
            colloque.setColloquedateevaluation(date);
            colloque.setMotcles(motcles);
            session.save(colloque);
            tr.commit();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * Mets à jour un colloque donné
     * 
     * @param request
     */
    public void updateColloque(HttpServletRequest request) {
        
        if ("updateInfos".equals(request.getParameter("action"))) {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            try {
                Transaction tx = session.beginTransaction();
                Colloque colloque = (Colloque) session.get(Colloque.class, Integer.parseInt(request.getParameter("colloque_id")));
                String[] motcles = request.getParameterValues("motcles");                
                List<String> lmc = Arrays.asList(motcles);
                Set<MotCle> tabmc = new HashSet<MotCle>(0);
                MotCle motcle;
                for (int i = 0; i < lmc.size(); i++) {
                    try {
                        motcle = (MotCle) session.get(MotCle.class, Integer.parseInt(lmc.get(i)));
                        tabmc.add(motcle);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
                String sql = "DELETE FROM EST_DEFINI_PAR WHERE COLLOQUEID = " + colloque.getColloqueid();
                SQLQuery query = session.createSQLQuery(sql);
                query.executeUpdate();
                colloque.setMotcles(tabmc);
                colloque.setColloquedescription(request.getParameter("colloquedescription"));
                colloque.setColloquenom(request.getParameter("colloquenom"));
                session.save(colloque);
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }
        
        if ("affecterMembres".equals(request.getParameter("action"))) {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            try {
                Transaction tx = session.beginTransaction();
                Colloque colloque = (Colloque) session.get(Colloque.class, Integer.parseInt(request.getParameter("colloque_id")));
                String[] membres = request.getParameterValues("membres_checked");
                
                List<String> lmembres = Arrays.asList(membres);
                Set<Utilisateur> tabmembres = new HashSet<Utilisateur>(0);
                Utilisateur membre;
                for (int i = 0; i < lmembres.size(); i++) {
                    try {
                        membre = (Utilisateur) session.get(Utilisateur.class, Integer.parseInt(lmembres.get(i)));
                        tabmembres.add(membre);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
                String sql = "DELETE FROM EST_MEMBRE WHERE COLLOQUEID = " + colloque.getColloqueid();
                SQLQuery query = session.createSQLQuery(sql);
                query.executeUpdate();
                colloque.setUtilisateurs(tabmembres);
                session.save(colloque);
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }
    }
        
    /*
     * Ajoute un message correspondant au champ spécifié à la map des erreurs.
     */
    private void setErreur( String champ, String message ) {
        erreurs.put( champ, message );
    }

    /*
     * Méthode utilitaire qui retourne null si un champ est vide, et son contenu
     * sinon.
     */
    private static String getValeurChamp( HttpServletRequest request, String nomChamp ) {
        String valeur = request.getParameter( nomChamp );
        if ( valeur == null || valeur.trim().length() == 0 ) {
            return null;
        } else {
            return valeur;
        }
    }
}

